package com.jms.framework.beans;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 抽象的Bean定义类，实现了BeanDefinition接口的部分方法
 * 提供了Bean的各种属性的默认实现，如类名、作用域、初始化方法等
 * @author JMS
 * @since 20250123
 * @version 1.0.0
 */
public abstract class AbstractBeanDefinition implements BeanDefinition {
    // Bean的名称
    protected String beanName;
    // Bean的类名
    protected String beanClassName;
    // Bean的作用域
    protected String scope;
    // 是否懒初始化
    protected boolean lazyInit;
    // 初始化方法名
    protected String initMethodName;
    // 销毁方法名
    protected String destroyMethodName;
    // Bean的依赖数组
    protected BeanDependency[] dependencies;
    // 属性的集合，使用ConcurrentHashMap保证线程安全
    protected ConcurrentHashMap<String, String> attributes;
    // Bean的排序序号
    protected int orderNumber;
    // 是否在初始化之后执行
    protected boolean afterInit;

    /**
     * 获取属性值
     * @param attributeName 属性名
     * @return 属性值
     */
    @Override
    public String getAttribute(String attributeName) {
        return attributes.get(attributeName);
    }

    /**
     * 设置属性值
     * @param attributeName 属性名
     * @param attributeValue 属性值
     */
    @Override
    public void setAttribute(String attributeName, String attributeValue) {
        attributes.put(attributeName, attributeValue);
    }

    /**
     * 移除属性
     * @param attributeName 属性名
     */
    @Override
    public void removeAttributeValue(String attributeName) {
        attributes.remove(attributeName);
    }

    /**
     * 获取Bean的类名
     * @return Bean的类名
     */
    @Override
    public String getBeanClassName() {
        return beanClassName;
    }

    /**
     * 设置Bean的类名
     * @param beanClassName Bean的类名
     */
    @Override
    public void setBeanClassName(String beanClassName) {
        this.beanClassName = beanClassName;
    }

    /**
     * 获取Bean的名称
     * @return Bean的名称
     */
    @Override
    public String getBeanName() {
        return beanName;
    }

    /**
     * 设置Bean的名称
     * @param beanName Bean的名称
     */
    @Override
    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    /**
     * 设置Bean的作用域
     * @param scope Bean的作用域
     */
    @Override
    public void setScope(String scope) {
        this.scope = scope;
    }

    /**
     * 获取Bean的作用域
     * @return Bean的作用域
     */
    @Override
    public String getScope() {
        return scope;
    }

    /**
     * 设置是否懒初始化
     * @param lazyInit 是否懒初始化
     */
    @Override
    public void setLazyInit(boolean lazyInit) {
        this.lazyInit = lazyInit;
    }

    /**
     * 判断是否懒初始化
     * @return 是否懒初始化
     */
    @Override
    public boolean isLazyInit() {
        return lazyInit;
    }

    /**
     * 设置初始化方法名
     * @param initMethodName 初始化方法名
     */
    @Override
    public void setInitMethodName(String initMethodName) {
        this.initMethodName = initMethodName;
    }

    /**
     * 获取初始化方法名
     * @return 初始化方法名
     */
    @Override
    public String getInitMethodName() {
        return initMethodName;
    }

    /**
     * 设置销毁方法名
     * @param destroyMethodName 销毁方法名
     */
    @Override
    public void setDestroyMethodName(String destroyMethodName) {
        this.destroyMethodName = destroyMethodName;
    }

    /**
     * 获取销毁方法名
     * @return 销毁方法名
     */
    @Override
    public String getDestroyMethodName() {
        return destroyMethodName;
    }

    /**
     * 设置依赖数组
     * @param dependencies 依赖数组
     */
    @Override
    public void setDependencies(BeanDependency[] dependencies) {
        this.dependencies = dependencies;
    }

    /**
     * 获取依赖数组
     * @return 依赖数组
     */
    @Override
    public BeanDependency[] getDependencies() {
        return dependencies;
    }

    /**
     * 设置Bean的排序序号
     * @param orderNumber 排序序号
     */
    @Override
    public void setOrderNumber(int orderNumber) {
        this.orderNumber = orderNumber;
    }

    /**
     * 获取Bean的排序序号
     * @return 排序序号
     */
    @Override
    public int getOrderNumber() {
        return orderNumber;
    }

    /**
     * 判断是否在初始化之后执行
     * @return 如果在初始化之后执行则返回true，否则返回false
     */
    @Override
    public boolean isAfterInit() {
        return afterInit;
    }

    /**
     * 设置是否在初始化方法执行后执行
     * @param afterInit 是否初始化方法执行后执行
     */
    @Override
    public void setAfterInit(boolean afterInit) {
        this.afterInit = afterInit;
    }
}
